Tensorarray ================= 张量数组操作,支持从张量数组中读取指定索引的张量,或将张量写入到张量数组的指定索引位置。该算子不区分数据类型,适用于所有数据类型。 **TensorArrayRead(读取操作):** 从张量数组中读取指定索引的张量,并将其数据复制到输出。 .. math:: \text{output} = \text{tensors}[\text{index}] **TensorArrayWrite(写入操作):** 将输入张量的数据复制到张量数组的指定索引位置。 .. math:: \text{tensors}[\text{index}] = \text{input} 两个操作都会复制数据,复制大小为 `size * type_size` 字节。 输入(TensorArrayRead): - **tensors** - 张量数组(Tensor** 类型),包含多个张量。 - **index** - 读取的索引(int 类型),指定从 `tensors` 数组中读取哪个张量。 - **core_mask** - 核掩码(int),仅共享存储版本需要。 输出(TensorArrayRead): - **output** - 输出张量(Tensor* 类型),包含复制后的数据。输出张量的 `size` 和 `type_size` 应与选中的输入张量相同。 输入(TensorArrayWrite): - **input** - 输入张量(Tensor* 类型),待写入的数据。 - **index** - 写入的索引(int 类型),指定写入到 `tensors` 数组的哪个位置。 - **tensors** - 张量数组(Tensor** 类型),目标数组。 - **core_mask** - 核掩码(int),仅共享存储版本需要。 输出(TensorArrayWrite): - **tensors[index]** - 张量数组指定位置的数据会被更新。 支持平台: ``FT78NE`` ``MT7004`` .. note:: - 该算子不区分数据类型,适用于所有数据类型 - 算子会复制数据,输入和输出张量数据独立 - 调用前需要确保目标内存空间足够大(至少 `size * type_size` 字节) - 读取和写入时,涉及的张量的 `size` 和 `type_size` 应匹配 **共享存储版本:** **TensorArrayRead(读取操作):** .. c:function:: void tensorarrayread_s(Tensor** tensors, int index, Tensor* output, int core_mask) **TensorArrayWrite(写入操作):** .. c:function:: void tensorarraywrite_s(Tensor* input, int index, Tensor** tensors, int core_mask) **C调用示例(TensorArrayRead):** .. code-block:: c :linenos: :emphasize-lines: 34 //FT78NE示例 #include #include int main(int argc, char* argv[]) { // 假设在DDR空间 Tensor tensor0, tensor1, tensor2; Tensor output; // 初始化张量数组中的张量 tensor0.type_size = 4; // float32 tensor0.size = 1000; tensor0.data = (void *)0xA0000000; tensor1.type_size = 4; tensor1.size = 1000; tensor1.data = (void *)0xA1000000; tensor2.type_size = 4; tensor2.size = 1000; tensor2.data = (void *)0xA2000000; // 初始化输出张量 output.type_size = 4; output.size = 1000; output.data = (void *)0xB0000000; // 需要预先分配足够的内存 // 创建张量数组 Tensor* tensors[3] = {&tensor0, &tensor1, &tensor2}; int index = 1; // 读取 tensor1 int core_mask = 0xff; tensorarrayread_s(tensors, index, &output, core_mask); // 此时 output.data 包含 tensor1.data 的副本 return 0; } **C调用示例(TensorArrayWrite):** .. code-block:: c :linenos: :emphasize-lines: 30 //FT78NE示例 #include #include int main(int argc, char* argv[]) { // 假设在DDR空间 Tensor input; Tensor tensor0, tensor1, tensor2; // 初始化输入张量 input.type_size = 4; // float32 input.size = 1000; input.data = (void *)0xA0000000; // 初始化张量数组中的张量(需要预先分配内存) tensor0.type_size = 4; tensor0.size = 1000; tensor0.data = (void *)0xB0000000; tensor1.type_size = 4; tensor1.size = 1000; tensor1.data = (void *)0xB0100000; tensor2.type_size = 4; tensor2.size = 1000; tensor2.data = (void *)0xB0200000; // 创建张量数组 Tensor* tensors[3] = {&tensor0, &tensor1, &tensor2}; int index = 1; // 写入到 tensor1 的位置 int core_mask = 0xff; tensorarraywrite_s(&input, index, tensors, core_mask); // 此时 tensors[1]->data 包含 input.data 的副本 return 0; } **私有存储版本:** **TensorArrayRead(读取操作):** .. c:function:: void tensorarrayread_p(Tensor** tensors, int index, Tensor* output) **TensorArrayWrite(写入操作):** .. c:function:: void tensorarraywrite_p(Tensor* input, int index, Tensor** tensors) **C调用示例(私有存储版本):** .. code-block:: c :linenos: :emphasize-lines: 14 //FT78NE示例 #include #include int main(int argc, char* argv[]) { // 假设在L2空间 Tensor tensor0, tensor1, tensor2; Tensor output; tensor0.type_size = 4; // float32 tensor0.size = 1000; tensor0.data = (void *)0x10000000; tensor1.type_size = 4; tensor1.size = 1000; tensor1.data = (void *)0x10001000; tensor2.type_size = 4; tensor2.size = 1000; tensor2.data = (void *)0x10002000; output.type_size = 4; output.size = 1000; output.data = (void *)0x10003000; // 需要预先分配足够的内存 Tensor* tensors[3] = {&tensor0, &tensor1, &tensor2}; int index = 0; // 读取 tensor0 tensorarrayread_p(tensors, index, &output); return 0; }